# js处理大数据不卡顿

# 使用webworker

html

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Document</title>
</head>
<body>
    <div style="height: 300px;background: red;"></div>
    <div style="height: 300px;background: blue;"></div>
    <div style="height: 300px;background: yellow;"></div>
    <div style="height: 300px;background: red;"></div>
    <div style="height: 300px;background: blue;"></div>
    <div style="height: 300px;background: yellow;"></div>
    <div style="height: 300px;background: red;"></div>
    <div style="height: 300px;background: blue;"></div>
    <div style="height: 300px;background: yellow;"></div>
    <div style="height: 300px;background: red;"></div>
    <div style="height: 300px;background: blue;"></div>
    <div style="height: 300px;background: yellow;"></div>
    <script>
        let works = new Worker('work.js') // 1.新建works
        works.postMessage({max: 10000000}) // 2 给works发送参数
        works.onmessage = function (event) { // 6. 接收works的数据并处理操作
          console.log(event.data)
          works.terminate() // 7 关闭works主线程
        }
      </script>
</body>
</html>

work.js

self.addEventListener('message', function (e) {
    shui(e.data.max) // 3. works接收参数并处理 不会影响主线程 不会造成主页面卡顿
}, false)
function shui(numMax) {
    let arr = [] // 伪造大量测试数据
    function getRandom() {
        let random = Math.ceil(Math.random() * 10000)
        return random
    }
    for (let i = 0; i < numMax; i++) {
        arr.push(getRandom())
    }
    arr.sort(function
        (a, b) { return a - b } // 排序
    )
    postMessage(arr) // 4. works处理完数据 发送回主页面
    self.close() // 5.记得要关闭哦
}